// app/controller/auth_controller.js
'use strict';

const { Controller } = require('egg');
const bcrypt = require('bcryptjs');

class AuthController extends Controller {
  // 用户登录
  async login() {
    const { ctx, app } = this;
    const { username, password } = ctx.request.body;
    
    try {
      // 参数验证
      const rule = {
        username: { type: 'string', required: true, min: 1, max: 50 },
        password: { type: 'string', required: true, min: 6, max: 50 }
      };
      
      ctx.validate(rule, { username, password });
      
      // 查找用户
      const user = await ctx.model.UserModel.findOne({
        where: {
          name: username
        }
      });
      
      if (!user) {
        ctx.error('用户名或密码错误', 401);
        return;
      }
      
      // 验证密码（这里简化处理，实际应该使用bcrypt）
      // 注意：在实际应用中，密码应该在创建时就加密存储
      if (user.password !== password) {
        ctx.error('用户名或密码错误', 401);
        return;
      }
      
      // 生成JWT token
      const token = app.jwt.sign({
        user: {
          id: user.id,
          name: user.name,
          role: user.role  // 添加role信息到token中
        }
      }, app.config.jwt.secret, {
        expiresIn: '24h'
      });
      
      // 更新最后登录时间
      await user.update({
        lastLoginAt: new Date()
      });
      
      // 返回用户信息和token
      ctx.success({
        token,
        user: {
          id: user.id,
          name: user.name,
          email: user.email,
          role: user.role,
          isAdmin: user.role === 'admin'
        }
      }, '登录成功');
    } catch (error) {
      ctx.logger.error('用户登录失败:', error);
      ctx.error(`登录失败: ${error.message}`, 401);
    }
  }
  
  // 用户登出
  async logout() {
    const { ctx } = this;
    
    try {
      // 在JWT模式下，登出主要是客户端清除token
      // 服务端可以将token加入黑名单（这里简化处理）
      ctx.success(null, '登出成功');
    } catch (error) {
      ctx.logger.error('用户登出失败:', error);
      ctx.error(`登出失败: ${error.message}`);
    }
  }
  
  // 获取当前用户信息
  async getCurrentUser() {
    const { ctx } = this;
    
    try {
      // 从token中获取用户信息
      const user = ctx.state.user;
      
      if (!user) {
        ctx.error('未登录', 401);
        return;
      }
      
      // 获取完整的用户信息
      const fullUser = await ctx.model.UserModel.findByPk(user.id);
      
      if (!fullUser) {
        ctx.error('用户不存在', 404);
        return;
      }
      
      ctx.success({
        id: fullUser.id,
        name: fullUser.name,
        email: fullUser.email,
        role: fullUser.role,
        isAdmin: fullUser.role === 'admin',
        lastLoginAt: fullUser.lastLoginAt,
        createdAt: fullUser.createdAt
      });
    } catch (error) {
      ctx.logger.error('获取当前用户信息失败:', error);
      ctx.error(`获取用户信息失败: ${error.message}`);
    }
  }
}

module.exports = AuthController;